package com.mashuai.utils.ztest.toolkit.handleBean;

import com.alibaba.fastjson.JSON;
import com.mashuai.utils.base.MsAssertUtils;
import com.mashuai.utils.toolkit.core.msConverts.MsConvertDataUtils;
import com.mashuai.utils.toolkit.core.msCrudbean.MsCrudUtils;
import com.mashuai.utils.toolkit.core.msCrudbean.dto.MsCrudDto;
import com.mashuai.utils.toolkit.core.msHandlebean.MsHandleDataUtils;
import com.mashuai.utils.toolkit.core.msHandlebean.dto.MsDelCheckDto;
import com.mashuai.utils.toolkit.core.msHandlebean.dto.MsSaveCheckDto;
import com.mashuai.utils.toolkit.core.msMp.MsDb;
import com.mashuai.utils.ztest.pb.bean.MsDict;
import com.mashuai.utils.ztest.pb.bean.MsRoom;
import com.mashuai.utils.ztest.pb.bean.MsUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: MsHandleBeanTestController
 * @Description:
 */
@RestController
@RequestMapping("/test/handlebean/")
public class MsHandleBeanTestController {

    /***
     * 获取房间数据，直接查询所有的房间数据，不做任何处理
     * */
    public List<MsRoom> getData() {
        return MsDb.list(MsRoom.class);
    }

    /**
     * 转义字典值、关联表数据带出
     **/
    @GetMapping("/handleTableAndDict")
    public void handleTableAndDict() {
        MsAssertUtils.throwException("2222");
        List<MsRoom> data = getData();
        System.err.println("---------未处理的数据-----------");
        System.err.println(JSON.toJSONString(data.get(0)));
        //处理数据
        MsHandleDataUtils.handleTbOrDictValBeans(data, MsRoom.class);
        System.err.println("---------已处理的数据-----------");
        System.err.println(JSON.toJSONString(data.get(0)));
    }

    /**
     * 转义字典值、关联表数据带出
     **/
    @GetMapping("/handleSubTable")
    public void handleSubTable() {
        List<MsRoom> data = getData();
        MsRoom msRoom = data.get(0);
        //处理数据
        MsHandleDataUtils.handleTbOrDictValBeans(msRoom, MsRoom.class);
        System.err.println("---------已处理的数据-----------");
        System.err.println(MsConvertDataUtils.objToJsonStr(msRoom));
    }

    /**
     * 保存数据检验，比如保存房间的时候，对其房号name字段，进行唯一性校验
     **/
    @GetMapping("/saveDataCheck")
    public void saveDataCheck() throws Exception {
        //获取查询结果第一条数据
        MsRoom room = getData().get(0);
        //把id置空，模拟新增数据...此时房号name字段值是已经存在了，看是否能够保存
        room.setId("");
        MsHandleDataUtils.handleSaveCheck(room);
        System.err.println("只要值存在了，就会自动抛出异常");
        MsDb.insert(room);
    }


    /**
     * 值存在重复也不抛出异常，用户接受异常返回值，自己进行业务处理
     **/
    @GetMapping("/saveDataCheckNoThrow")
    public void saveDataCheckNoThrow() throws Exception {
        //获取查询结果第一条数据
        MsRoom room = getData().get(0);
        //把id置空，模拟新增数据...此时房号name字段值是已经存在了，看是否能够保存
        room.setId("");
        List<MsSaveCheckDto> dtoList = MsHandleDataUtils.handleSaveCheck(room, false);
        System.err.println("如果值存在的时候，不抛出异常，会吧检查结果进行返回，用户根据自己需求进行业务逻辑即可");
        //MsDb.save(room);
    }

    /**
     * 删除数据，判断数据是否被引用
     * 比如：我删除房间时候，首先判断房间是否已经被租户使用，如果租户正在住，不允许删除
     **/
    @GetMapping("/delDataCheck")
    public void delDataCheck() throws Exception {
        //获取查询结果第一条数据
        ArrayList<String> roomIdList = new ArrayList<>();
        roomIdList.add("b1f1r1");
        roomIdList.add("b2f2r1");
        roomIdList.add("b1f1r2");
        MsHandleDataUtils.handleDelCheck(roomIdList, MsRoom.class);
        System.err.println("如果不发生异常，继续删除操作");
        MsDb.removeByIds(roomIdList, MsRoom.class);
    }

    /**
     * 删除数据，判断数据是否被引用
     * 比如：我删除房间时候，首先判断房间是否已经被租户使用，如果租户正在住，不允许删除
     **/
    @GetMapping("/delDataCheckNoThrow")
    public void delDataCheckNoThrow() throws Exception {
        //获取查询结果第一条数据
        ArrayList<String> roomIdList = new ArrayList<>();
        roomIdList.add("b1f1r1");
        roomIdList.add("b2f2r1");
        roomIdList.add("b1f1r2");
        List<MsDelCheckDto> dtoList = MsHandleDataUtils.handleDelCheck(roomIdList, MsRoom.class, false);
        System.err.println("如果删除的数据已经被引用了，不抛出异常，会吧检查结果进行返回，用户根据自己需求进行业务逻辑即可");
        // MsDb.removeByIds(roomIdList, MsRoom.class);
    }


    /**
     * 处理多表映射
     **/
    @GetMapping("/handleMoreTable")
    public void handleMoreTable() {
        List<MsUser> list = MsDb.list(MsUser.class);
        //处理数据
        MsHandleDataUtils.handleTbOrDictValBeans(list.get(0), MsUser.class);

        System.err.println("---------已处理的数据-----------");
        System.err.println(JSON.toJSONString(list.get(0)));
        //现在有三个注解，@Aa,@Bb,@Cc，我如何写一个方法，可以接受这个三个注解类型
    }


    /**
     * 把表的数据转换成字典数据选项
     *
     * @param
     * @return
     * @author mashuai
     */

    @GetMapping("/handleTbDictSelect")
    public Object handleTbDictSelect() {
        List<MsUser> list = MsDb.list(MsUser.class);
        return MsHandleDataUtils.handleTbDictSelect(list, MsUser.class);
    }

    /**
     * 排除某个注解
     **/
    @GetMapping("/excludedAnnotations")
    public Object excludedAnnotations() {
        List<MsUser> list = MsDb.list(MsUser.class);
        MsHandleDataUtils.handleTbOrDictValBeans(list, MsUser.class, "roomId-type");
        return list;
    }

    /***
     *获取某张表最大顺序号
     */
    @GetMapping("/tbMaxForder")
    public Object tbMaxForder() throws Exception {
        MsCrudDto dto = new MsCrudDto();
        dto.setTargetParam("msUser");
        return MsCrudUtils.tbMaxForder(dto);
    }

    @GetMapping("/customTest")
    public void customTest(){
        List<MsDict> list = MsDb.list(null, MsDict.class);
        MsHandleDataUtils.handleTbOrDictValBeans(list,MsDict.class);
    }
}
